home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d12
/
snip9_91.arc
/
SETVOL.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-09-17
|
3KB
|
116 lines
/*
** SETVOL.C - set, change, or kill a disk volume label
**
** public domain demo by Bob Stout
*/
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <io.h>
#if defined(__TURBOC__)
#pragma option -a-
#include <dir.h>
#define _dos_findfirst(f,a,b) findfirst(f,b,a)
#define _dos_findnext(b) findnext(b)
#define find_t ffblk
#define _A_VOLID FA_LABEL
#define attrib ff_attrib
#define name ff_name
#define size ff_size
#define wr_time ff_time
#define wr_date ff_date
#define dos_creat _creat
#else
#include <direct.h>
#if defined(__ZTC__)
#pragma ZTC align 1
#if __ZTC__ < 0x210
#include <mflfiles.h> /* old ZTC didn't do recursive find first/next */
#include <msport.h> /* ...so use MFLZT library functions */
#endif
#else /* MSC/QC/WATCOM/METAWARE */
#pragma pack(1)
int dos_creat(const char *fname, unsigned attrib)
{
int fd;
if (_dos_creat(fname, attrib, &fd))
return -1;
else return fd;
}
#endif
struct fcb {
char fcb_drive;
char fcb_name[8];
char fcb_ext[3];
short fcb_curblk;
short fcb_recsize;
long fcb_filsize;
short fcb_date;
char fcb_resv[10];
char fcb_currec;
long fcb_random;
};
struct xfcb {
char xfcb_flag;
char xfcb_resv[5];
char xfcb_attr;
struct fcb xfcb_fcb;
};
#endif
void vol_kill(char *fname)
{
union REGS regs;
struct SREGS sregs;
struct xfcb buf;
/* Parse the filename into an FCB */
segread(&sregs);
regs.h.ah = 0x29;
regs.h.al = 0;
regs.x.si = (unsigned)fname;
regs.x.di = (unsigned)&buf.xfcb_fcb;
sregs.es = sregs.ds;
intdosx(®s, ®s, &sregs);
/* Volume labels require extended FCB's */
buf.xfcb_flag = 0xff;
buf.xfcb_attr = _A_VOLID;
/* Delete the old label */
regs.h.ah = 0x13;
regs.x.dx = (unsigned)&buf;
intdos(®s, ®s);
}
void setvol(char *label)
{
int fd;
struct find_t finfo;
union REGS regs;
chdir("\\"); /* Move to the root directory */
/* If drive is already labeled, remove it */
if (0 == _dos_findfirst("*.*", _A_VOLID, &finfo)) do
{ if (_A_VOLID & finfo.attrib)
break;
} while (0 == _dos_findnext(&finfo));
if (_A_VOLID & finfo.attrib)
vol_kill(finfo.name);
fd = dos_creat(label, _A_VOLID); /* Create new label */
close(fd);
}
void main(int argc, char *argv[])
{
if (2 > argc)
{ puts("\aUsage: SETVOL new_name");
abort();
}
setvol(argv[1]);
}